package com.lxw.station.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.lxw.station.GitOps;
import com.lxw.station.entity.GithubProject;
import com.lxw.station.service.GithubProjectService;
import com.lxw.station.service.RestTemplateService;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.model.ZipParameters;
import org.apache.commons.io.FileUtils;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

@Slf4j
@RestController
@RequestMapping("/githubProject")
public class GithubProjectController {

    @Resource
    GithubProjectService githubProjectService;
    private static final int pageCount = 10;
//    private static final String keyWord = "毕业设计";
    // 各种电子书
    private static final String keyWord = "读书笔记";
//    private static final String keyWord = "微信小程序";
//    private static final String keyWord = "读书笔记";
//    private static final String keyWord = "学习笔记";
//    private static final String keyWord = "Java核心技术卷";
//    private static final String keyWord = "Java编程思想";
//    private static final String keyWord = "Effective Java中文版";
//    private static final String keyWord = "Java网络编程";
//    private static final String keyWord = "Java并发编程实战";
//    private static final String keyWord = "深入理解Java虚拟机";
//    private static final String keyWord = "Java性能权威指南";
//    private static final String keyWord = "代码整洁之道";
//    private static final String keyWord = "设计模式之禅";
//    private static final String keyWord = "算法";
//    private static final String keyWord = "深入理解Java虚拟机：JVM高级特性与最佳实践";
//    private static final String keyWord = "Head First Java";
    public static List<String> kws = new ArrayList<>();
    static {
//        kws.add("明解Java");
//        kws.add("Java从入门到精通");
//        kws.add("入门很简单丛书：Java Web开发入门很简单");
//        kws.add("程序员炼成记 从小白到工程师");
//        kws.add("Java从小白到大牛");
//        kws.add("JavaWeb项目开发实战入门");
//        kws.add("Java精彩编程200例");
//        kws.add("Java轻松学");
//        kws.add("大话Java：程序设计从入门到精通");
//        kws.add("Java语言袖珍指南");
//        kws.add("Java编程思想");
//        kws.add("Java核心技术 卷I：基础知识");
//        kws.add("Java核心技术卷II：高级特性");
//        kws.add("华章专业开发者丛书·Java并发编程实战");
//        kws.add("Java多线程编程实战指南");
//        kws.add("图解Java多线程设计模式");
//        kws.add("实战Java高并发程序设计");
//        kws.add("Java高并发编程详解：多线程与架构设计");
//        kws.add("Java核心技术系列：Java多线程编程核心技术 ");
//        kws.add("Java并发编程：核心方法与框架");
//        kws.add("Java多线程与Socket：实战微服务框架");
//        kws.add("NIO与Socket编程技术指南");
//        kws.add("Java并发编程之美");
//        kws.add("实战Java高并发程序设计");
//        kws.add("Java网络编程");
//        kws.add("数据结构与算法分析：Java语言描述");
//        kws.add("图解数据结构：使用Java");
//        kws.add("数据结构与算法Java语言描述");
//        kws.add("Java 8实战");
//        kws.add("Java函数式编程");
//        kws.add("Java编程的逻辑");
//        kws.add("O'Reilly：Head First Java");
//        kws.add("写给大忙人看的Java核心技术");
//        kws.add("精通lambda表达式：Java多核编程 ");
//        kws.add("Java 9模块化开发：核心原则与实践");
//        kws.add("Java JDK 9学习笔记");
//        kws.add("Java 9编程参考官方大全");
//        kws.add("写给大忙人的Java SE 9核心技术");
//        kws.add("深入分析Java Web技术内幕");
//        kws.add("Java RESTful Web Service实战");
//        kws.add("Java性能优化权威指南 ");
//        kws.add("Java程序性能优化：让你的Java程序更快、更稳定");
//        kws.add("Java性能权威指南");
//        kws.add("51CTO学院系列丛书·实战Java虚拟机：JVM故障诊断与性能优化");
//        kws.add("Java性能调优指南");
//        kws.add("大话Java性能优化");
//        kws.add("响应式架构：消息模式Actor实现与Scala、Akka应用集成");
//        kws.add("RxJava响应式编程");
//        kws.add("RxJava 2.x 实战");
//        kws.add("深入理解Java虚拟机：JVM高级特性与最佳实践");
//        kws.add("Java核心技术系列：Java虚拟机规范");
//        kws.add("揭秘Java虚拟机：JVM设计原理与实现");
//        kws.add("HotSpot实战");
//        kws.add("Java从入门到动手写虚拟机1");
//        kws.add("重构 改善既有代码的设计 Java语言版");
//        kws.add("Effective Java中文版");
//        kws.add("代码整洁之道 程序员的职业素养");
//        kws.add("代码整洁之道 ");
//        kws.add("Spring实战");
//        kws.add("代码不朽：编写可维护软件的10大要则");
//        kws.add("Java代码与架构之完美优化 实战经典");
//        kws.add("反应式设计模式");
//        kws.add("O'Reilly：Head First设计模式");
//        kws.add("设计模式：可复用面向对象软件的基础");
//        kws.add("实现领域驱动设计 ");
//        kws.add("原创精品系列：设计模式之禅");
//        kws.add("图解设计模式");
//        kws.add("大话设计模式");
//        kws.add("领域驱动设计 软件核心复杂性应对之道 修订版");
//        kws.add("Java测试驱动开发");
//        kws.add("高性能MySQL");
//        kws.add("MySQL技术内幕：InnoDB存储引擎");
//        kws.add("大型网站系统与Java中间件实践");
//        kws.add("深入浅出MySQL 数据库开发 优化与管理维护 第2版");
//        kws.add("PostgreSQL修炼之道：从小工到专家");
//        kws.add("PostgreSQL技术内幕：查询优化深度探索");
//        kws.add("Redis 深度历险：核心原理与应用实践");
//        kws.add("Redis实战");
//        kws.add("Redis入门指南");
//        kws.add("深入分布式缓存：从原理到实践");
//        kws.add("人人都是架构师：分布式系统架构落地与瓶颈突破");
//        kws.add("MongoDB应用设计模式");
//        kws.add("MongoDB实战 架构、开发与管理");
//        kws.add("NoSQL数据库入门与实践");
//        kws.add("RabbitMQ实战指南");
//        kws.add("Kafka权威指南");
//        kws.add("Kafka入门与实践");
//        kws.add("RocketMQ实战与原理解析");
//        kws.add("Kafka技术内幕 图文详解Kafka源码设计与实现");
//        kws.add("深入理解Kafka：核心设计与实践原理");
//        kws.add("分布式消息中间件实践");
//        kws.add("MyBatis从入门到精通");
//        kws.add("Spring微服务实战");
//        kws.add("Spring Cloud微服务实战");
//        kws.add("深入理解Spring Cloud与微服务构建");
//        kws.add("MyBatis技术内幕");
//        kws.add("Spring Boot实战");
//        kws.add("深入浅出Spring Boot 2.x");
//        kws.add("JavaEE开发的颠覆者：Spring Boot实战");
//        kws.add("Spring技术内幕：深入解析Spring架构与设计原理");
//        kws.add("Spring Boot 2精髓：从构建小系统到架构分布式大系统");
//        kws.add("Spring 5开发大全");
//        kws.add("Spring Cloud微服务架构进阶");
//        kws.add("Spring源码深度解析 第2版");
//        kws.add("Spring MVC实战");
//        kws.add("Spring Boot编程思想");
//        kws.add("互联网轻量级SSM框架解密：Spring、Spring MVC、MyBatis源码深度剖析");
//        kws.add("Spring学习指南 第3版");
//        kws.add("精通Spring MVC 4");
//        kws.add("Netty实战");
//        kws.add("七周七并发模型");
//        kws.add("Netty权威指南");
//        kws.add("Netty进阶之路：跟着案例学Netty");
//        kws.add("从Paxos到Zookeeper分布式一致性原理与实践");
//        kws.add("ZooKeeper：分布式过程协同技术详解");
//        kws.add("从Lucene到Elasticsearch：全文检索实战");
//        kws.add("Hadoop权威指南：大数据的存储与分析(第4版)");
//        kws.add("Hadoop构建数据仓库实践");
//        kws.add("HBase权威指南 ");
//        kws.add("图解Spark：核心技术与案例实战");
//        kws.add("Hive编程指南 ");
//        kws.add("HBase应用架构");
//        kws.add("Web性能权威指南");
//        kws.add("从零开始学架构：照着做，你也能成为架构师");
//        kws.add("Java应用架构设计：模块化模式与OSGi");
//        kws.add("大型网站技术架构演进与性能优化");
//        kws.add("高可用架构");
//        kws.add("Java架构师指南");
//        kws.add("大话代码架构");
//        kws.add("小团队构建大网站：中小研发团队架构实践");
//        kws.add("未来架构 从服务化到云原生(限量签名 随机发放)");
//        kws.add("可伸缩架构：面向增长应用的高可用");
//        kws.add("分布式服务架构：原理、设计与实战");
//        kws.add("亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统");
//        kws.add("大型分布式网站架构设计与实践");
//        kws.add("可伸缩服务架构：框架与中间件");
//        kws.add("架构探险：从零开始写分布式服务框架");
//        kws.add("Cloud Native分布式架构原理与实践");
//        kws.add("分布式系统常用技术及案例分析");
//        kws.add("云原生Java：Spring Boot、Spring Cloud与Cloud Foundry弹性系统设计");
//        kws.add("微服务设计");
//        kws.add("生产微服务");
//        kws.add("架构解密：从分布式到微服务");
//        kws.add("Java微服务");
//        kws.add("Spring Cloud 微服务架构开发实战");
//        kws.add("微服务实践");
//        kws.add("架构整洁之道");
//        kws.add("企业应用架构模式 ");
//        kws.add("企业IT架构转型之道 阿里巴巴中台战略思想与架构实战");
//        kws.add("聊聊“架构”");
//        kws.add("架构真经：互联网技术架构的设计原则");
//        kws.add("软件架构设计：程序员向架构师转型必备");
//        kws.add("恰如其分的软件架构 ");
//        kws.add("软件架构设计：大型网站技术架构与业务架构融合之道");
//        kws.add("Scala编程");
//        kws.add("Groovy程序设计");
        kws.add("快学Scala");
        kws.add("Kotlin极简教程");
        kws.add("Scala集合技术手册");
        kws.add("构建之法 现代软件工程");
        kws.add("精益思想");
        kws.add("给产品经理讲技术");
        kws.add("持续交付：发布可靠软件的系统方法");
        kws.add("名家经典系列：人件");
        kws.add("硝烟中的Scrum和XP：我们如何实施Scrum");
        kws.add("敏捷软件开发实践 估算与计划");
        kws.add("人月神话");
        kws.add("Scrum敏捷软件开发");
        kws.add("用户故事与敏捷方法 ");
        kws.add("用户故事地图 ");
        kws.add("知行合一 实现价值驱动的敏捷和精益开发");
        kws.add("互联网项目管理实践精粹");
        kws.add("卓有成效的管理者");
        kws.add("跃迁：从技术到管理的硅谷路径");
        kws.add("告别失控 软件开发团队管理必读");
        kws.add("赋能：打造应对不确定性的敏捷团队 ");
        kws.add("OKR工作法：谷歌、领英等顶级公司的高绩效秘籍 ");
        kws.add("CTO说");
        kws.add("轻流程 IT团队的积分式绩效管理");
        kws.add("技术领导力：程序员如何才能带团队");
        kws.add("敏捷文化：如何打造优秀的高效能团队 ");
        kws.add("数学之美");
        kws.add("程序员的数学2 概率统计");
        kws.add("程序员的数学3 线性代数");
        kws.add("程序员的数学");
        kws.add("程序员的数学思维修炼");
        kws.add("统计之美：人工智能时代的科学思维");
        kws.add("统计思维：程序员数学之概率统计");
        kws.add("算法导论");
        kws.add("算法图解");
        kws.add("漫画算法：小灰的算法之旅");
        kws.add("我编程，我快乐：程序员职业规划之道");
        kws.add("程序员的自我修养");
        kws.add("码农翻身：用故事给技术加点料");
        kws.add("程序员修炼之道：从小工到专家");
        kws.add("极客与团队：软件工程师的团队生存秘笈");
        kws.add("程序员思维修炼(修订版)");
        kws.add("高效能程序员的修炼");
        kws.add("O'Reilly：卓有成效的程序员 ");
        kws.add("Java工程师修炼之道");
        kws.add("程序员的成长课");
        kws.add("高效程序员的45个习惯：敏捷开发修炼之道(修订版)");
        kws.add("温伯格技术思想三部曲：颠覆完美软件 软件测试必须知道的几件事");
        kws.add("温伯格技术思想三部曲：程序开发心理学");
        kws.add("软件开发本质论：追求简约、体现价值、逐步构建");
        kws.add("内外兼修：程序员的成长之路");
        kws.add(" 把时间当作朋友");
        kws.add("暗时间");
        kws.add("关键对话：如何高效能沟通");
        kws.add("温伯格技术思想三部曲：成为技术领导者 掌握全面解决问题的方法");
        kws.add("软技能 代码之外的生存指南");
        kws.add("程序员健康指南");
        kws.add("如何把事情做到最好：改变全球9800万人的人生指导书 ");
        kws.add("程序员的英语");
        kws.add("高效能人士的七个习惯");
        kws.add("码出高效：Java开发手册");
        kws.add("大数据之路 阿里巴巴大数据实践");
        kws.add("技术之瞳 阿里巴巴技术笔试心得");
        kws.add("淘宝技术这十年");
        kws.add("尽在双11 阿里巴巴技术演进与超越");
        kws.add("逆流而上：阿里巴巴技术成长之路");
        kws.add("京东基础架构建设之路");
        kws.add("京东系统质量保障技术实战");
        kws.add("京东技术解密");
        kws.add("Linux命令行与shell脚本编程大全");
        kws.add("阿里巴巴Java开发手册");
        kws.add("SQL即查即用 ");
        kws.add("Linux命令速查手册");
        kws.add("剑指Offer：名企面试官精讲典型编程题");
        kws.add("编程之美：微软技术面试心得");
        kws.add("Java程序员面试笔试宝典");
        kws.add("Java程序员面试宝典");
        kws.add("编程之法：面试和算法心得");
        kws.add("Java程序员面试算法宝典");
        kws.add("Java程序员面试笔试真题库");
        kws.add("Java程序员面试笔试真题与解析");
        kws.add("Java核心技术及面试指南");
        kws.add("解忧程序员：高薪编程、求职面试与成长转型宝典");
        kws.add("全球科技通史");
        kws.add("浪潮之巅 第三版 套装上下册");
        kws.add("黑客与画家：硅谷创业之父Paul Graham文集 ");
        kws.add("软件随想录 卷1");
        kws.add("软件随想录 卷2");
        kws.add("编程人生：15位软件先驱访谈录");
        kws.add("大教堂与集市");
        kws.add("硅谷之谜：浪潮之巅 续集");
        kws.add("原则 ");
//        kws.add("精益创业");
//        kws.add("态度：吴军博士新书");
//        kws.add("见识");
//        kws.add("极限创新 35岁之前改变世界的全球科技精英");
//        kws.add("大学的终结：泛在大学与高等教育革命");
//        kws.add("未来版图 全球聪明公司的科技创新趋势和商业化路径");
//        kws.add("你好哇，程序员——漫话程序员面试求职、升职加薪、创业与生活");
//        kws.add("图灵和ACM图灵奖");
//        kws.add("文明之光");
//        kws.add("大师访谈录：成就非凡的软件人生");
//        kws.add("计算机科学丛书：计算机程序的构造和解释");
//        kws.add("计算机科学丛书：编译原理");
//        kws.add("一个APP的诞生——从零开始设计你的手机应用");
//        kws.add("大型网站性能优化实战：从前端、网络、CDN到后端、大促的全链路性能优化详解");
//        kws.add("图解HTTP");
//        kws.add("图解TCP/IP 第5版");
//        kws.add("白帽子讲Web安全");
//        kws.add("Web安全攻防：渗透测试实战指南");
//        kws.add("Maven实战");
//        kws.add("大象：Thinking in UML");
//        kws.add("Git学习指南");
//        kws.add("UML基础、案例与应用");
//        kws.add("编码：隐匿在计算机软硬件背后的语言 ");
//        kws.add("DevOps实践指南");
//        kws.add("性能之巅：洞悉系统、企业与云计算");
//        kws.add("鸟哥的Linux私房菜");
        kws.add("程序员");

    }



    /**
     * 从github查询并保存到数据库
     */
    @GetMapping("/save")
    @SneakyThrows
    public void save() {
        for (String kw : kws) {
            for (int i = 1; i < pageCount; i++) {
                JSONObject jsonObject = queryFromGithub(String.valueOf(i),kw);
                int count = save2db(jsonObject);
                if (count == 0){
                    break;
                }
                Thread.sleep(3000);
            }
        }
    }
//    public void save() {
//        for (int i = 1; i < pageCount; i++) {
//            JSONObject jsonObject = queryFromGithub(String.valueOf(i),keyWord);
//            save2db(jsonObject);
//            Thread.sleep(3000);
//        }
//    }

    /**
     * 将从github查询到的信息解析入库
     */
    private int save2db(JSONObject response) {
        JSONArray jsonArray = response.getJSONObject("payload").getJSONArray("results");
        for (int i = 0; i < jsonArray.size(); i++) {
            try {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String description = jsonObject.getString("hl_trunc_description");
                JSONObject repository = jsonObject.getJSONObject("repo").getJSONObject("repository");
                String id = repository.getString("id");
                String owner_login = repository.getString("owner_login");
                // 烂人
                if ("cirosantilli".equals(owner_login)) {
                    continue;
                }
                description = operateString(description);
                if (description.length() > 500) {
                    description = description.substring(0,499);
                }
                String title = description;
                if (title.length()>60) {
                    title = title.substring(0,59);
                }
                String name = repository.getString("name");
                String url = "https://github.com/" + owner_login + "/" + name + ".git";
                GithubProject githubProject = new GithubProject();
                githubProject.setId(id);
                githubProject.setName(name);
                githubProject.setUrl(url);
                githubProject.setKeyWord(keyWord);
                githubProject.setDescription(description);
                githubProject.setTitle(title);
                githubProject.setOk("待下载");
                githubProjectService.save(githubProject);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return jsonArray.size();
    }

    //    @PostConstruct

    /**
     * 从github下载代码
     */
    @GetMapping("/clone2local")
    @SneakyThrows
    private void clone2local() {
        LambdaQueryWrapper<GithubProject> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(GithubProject::getKeyWord, keyWord);
        wrapper.eq(GithubProject::getOk, "待下载");
        List<GithubProject> list = githubProjectService.list(wrapper);
        for (GithubProject githubProject : list) {
            File dir = null;
            try {
                String id = githubProject.getId();
                String url = githubProject.getUrl();
                String name = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("."));
                dir = new File("E:\\csdn\\github\\" + keyWord + "\\" + id + "\\" + name);
                GitOps.clone(url, dir.getAbsolutePath());
                githubProjectService.updateById(new GithubProject().setId(githubProject.getId()).setOk("已下载"));
            } catch (Exception e) {
                if (dir != null) {
                    FileUtils.deleteDirectory(dir);
                }
                e.printStackTrace();
            }
        }
    }
//    @PostConstruct
    public void tmp() {
        LambdaQueryWrapper<GithubProject> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(GithubProject::getOk, "待下载");
        List<GithubProject> list = githubProjectService.list(wrapper);
        for (GithubProject githubProject : list) {
            GithubProject update = new GithubProject();
            update.setId(githubProject.getId());
            update.setTitle(operateString(githubProject.getTitle()));
            update.setDescription(operateString(githubProject.getDescription()));
            githubProjectService.updateById(update);
        }
    }

    /**
     * 打包到E:\csdn\待上传\github下
     */
    @GetMapping("/zip")
    public void zip() {
        LambdaQueryWrapper<GithubProject> wrapper = new LambdaQueryWrapper<>();
//        wrapper.eq(GithubProject::getKeyWord, keyWord);
        wrapper.eq(GithubProject::getOk, "已下载");
        List<GithubProject> list = githubProjectService.list(wrapper);
        Map<String, GithubProject> map = list.stream().collect(Collectors.toMap(GithubProject::getId, Function.identity()));
        for (File dir : new File("E:\\csdn\\github\\" + keyWord).listFiles()) {
            String zipFileFullName = null;
            try {
                File[] files = dir.listFiles();
                // 后期zip包不再放到这里,这块逻辑应该不会再走了
                if (Arrays.stream(files).anyMatch(item -> item.getName().endsWith(".zip"))) {
                    continue;
                }
                if (files.length == 1) {
                    File project = files[0];
                    GithubProject gitProject = map.get(dir.getName());
                    if (gitProject != null) {
                        String title = gitProject.getTitle();
                        title = operateString(title);
                        if (title.length() < 62 - keyWord.length()) {
                            if (!title.startsWith(keyWord)) {
                                title = keyWord + "：" + title;
                            }
                        }
                        if (title.length() > 64) {
                            title = title.substring(0, 64);
                        }
                        zipFileFullName = "E:\\csdn\\待上传\\github\\" + keyWord + "\\" + title + ".zip";
                        packageZip(zipFileFullName, project.getAbsolutePath(), title,dir.getName());
                    }
                }
            } catch (Exception e) {
                if (zipFileFullName != null) {
                    new File(zipFileFullName).delete();
                }
                e.printStackTrace();
            }

        }
    }

    private String operateString(String title) {
        // 文件名 不支持的字符列表
        String[] invalidChars = {"\\", "/", ":", "*", "?", "\"", "<", ">", "|"};
        // 替换不支持的字符为空字符串
        for (String invalidChar : invalidChars) {
            title = title.replace(invalidChar, "");
        }
        // 替换掉标题中的表情
        title = title.replaceAll( "[\\p{So}\\p{Cn}\\uD83C\\uDF00-\\uD83D\\uDDFF\\uD83E\\uDD00-\\uD83E\\uDFFF]", "");
        title = title.replace("<em>", "").replace("</em>", "");
        return title;
    }

    @SneakyThrows
    public void packageZip(String zipFileFullName, String folder, String rootFolder,String comment) {
        long start = System.currentTimeMillis();
        File file = new File(zipFileFullName);
        if (file.exists()) {
            log.info("文件已存在:{}", zipFileFullName);
            return;
        }
        File parentFile = file.getParentFile();
        if (!parentFile.exists()) {
            parentFile.mkdirs();
        }
        ZipParameters parameters = new ZipParameters();
        parameters.setRootFolderNameInZip(rootFolder);
        // 压缩包位置
        ZipFile zipFile = new ZipFile(zipFileFullName);
        // 添加文件夹到压缩文件，包括子文件夹和文件
        zipFile.addFolder(new File(folder), parameters);
        zipFile.setComment(comment);
        long end = System.currentTimeMillis();
        log.info((end - start) + "\t打包完成:" + zipFileFullName);
    }

    public static void main(String[] args) throws Exception {
        String emojiPattern = "[\\p{So}\\p{Cn}\\uD83C\\uDF00-\\uD83D\\uDDFF\\uD83E\\uDD00-\\uD83E\\uDFFF]";
        String input = "读书笔记：☀《重新定义Spring Cloud实战》,怎么没有替换掉这个表情呢😊";
        String s = input.replaceAll(emojiPattern, "");
        System.out.println("s = " + s);
    }

    private static void extracted() throws IOException {
        int index = 1;
        int count = 1;
        for (File file : new File("E:\\csdn\\待上传\\github\\读书笔记").listFiles()) {
            if (file.isDirectory()) {
                continue;
            }
            if (file.getName().length()<60) {
                String s = file.getParent() + "//" + index + "//"+file.getName();
                File target = new File(s);
                File parentFile = target.getParentFile();
                if (!parentFile.exists()) {
                    parentFile.mkdirs();
                }
                FileUtils.copyFile(file,target);
                count++;
                if(count>100){
                    index++;
                    count = 1;
                }
            }
        }
    }

    public void xxx() {
        LambdaQueryWrapper<GithubProject> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(GithubProject::getOk, "待下载");
        List<GithubProject> list = githubProjectService.list(wrapper);
        for (GithubProject githubProject : list) {
            String encrypt = encrypt(JSON.toJSONString(githubProject));
            System.out.println("encrypt = " + encrypt);
            String decrypt = decrypt(encrypt);
            System.out.println("decrypt = " + decrypt);
            JSONObject jsonObject = JSON.parseObject(decrypt);
            System.out.println("jsonObject = " + jsonObject);
        }
    }

    /**
     * 加密
     */
    private static String encrypt(String s) {
        // 创建加密器并配置
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword("1qaz@WSX"); // 设置密钥
        config.setAlgorithm("PBEWithMD5AndDES"); // 设置算法
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        // 加密
        return encryptor.encrypt(s);
    }

    /**
     * 解密
     * @param s
     * @return
     */
    private static String decrypt(String s) {
        // 创建加密器并配置
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword("1qaz@WSX"); // 设置密钥
        config.setAlgorithm("PBEWithMD5AndDES"); // 设置算法
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        // 解密
        return encryptor.decrypt(s);
    }


    private static JSONObject queryFromGithub(String p,String keyWord) {
        System.out.println("keyWord = " + keyWord);
        String curl = "curl 'https://github.com/search?q=%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1&type=repositories&p=1' \\\n" +
                "  -H 'authority: github.com' \\\n" +
                "  -H 'accept: application/json' \\\n" +
                "  -H 'accept-language: zh-CN,zh;q=0.9' \\\n" +
                "  -H 'cookie: _octo=GH1.1.1506194046.1707203753; _device_id=1234364b687038ea5e0803df62df47af; saved_user_sessions=40336107%3AJrUaVDhwKW78FsuP9wjaveORIqOtIuh51U6trY92U7S73fUU; user_session=JrUaVDhwKW78FsuP9wjaveORIqOtIuh51U6trY92U7S73fUU; __Host-user_session_same_site=JrUaVDhwKW78FsuP9wjaveORIqOtIuh51U6trY92U7S73fUU; logged_in=yes; dotcom_user=lxw626; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; preferred_color_mode=light; tz=Asia%2FShanghai; _gh_sess=ptT3Vb3v8mo%2Fo77lMtNKEFbxF1nc7Qt8gFov614a0PxCvpOE30tctahCtDhId%2FmoI7wTDB90WkRxmDquKxdMpFmoFhxndtnSEjO6WRcGiNvo9JzdOfYMxdSIVaz1HS1kx56KymyhfLHodq6BzLj2YllsvWyYs2cg1zLWAGpO62wYZ2diExsWGTl2qy%2B5YEVJqIVPjnDs1MbbySnyJI5%2BhZOmObaFReNZUZiHzkVWBlF3cccFGhlpdb7ZZQlpUjYr7dF4ApqPdRIN1rB9O%2F8VMANBjf6gw4ZiSEFLjCWxt5imchOfFnH%2F3gNevrGS%2B1FajdYZoYdoQs0fO%2BB%2BKPv%2BA7smrkz5g3y3S98g3nnlFvqAoan9l2kybikoGoOVfXIyQf8wAJCcGLcPkXmikolOUZo0qZ4%3D--yESZO0znkvm0mIF2--bhiVKGAT4AY4S38VrCDaKQ%3D%3D' \\\n" +
                "  -H 'sec-ch-ua: \"Chromium\";v=\"122\", \"Not(A:Brand\";v=\"24\", \"Google Chrome\";v=\"122\"' \\\n" +
                "  -H 'sec-ch-ua-mobile: ?0' \\\n" +
                "  -H 'sec-ch-ua-platform: \"Windows\"' \\\n" +
                "  -H 'sec-fetch-dest: empty' \\\n" +
                "  -H 'sec-fetch-mode: cors' \\\n" +
                "  -H 'sec-fetch-site: same-origin' \\\n" +
                "  -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36' \\\n" +
                "  -H 'x-github-target: dotcom' \\\n" +
                "  -H 'x-requested-with: XMLHttpRequest'";
        String tmp = "https://github.com/search?q=${q}&type=repositories&p=${p}";
        String url = tmp.replace("${q}", keyWord).replace("${p}", p);
        HttpHeaders httpHeaders = RestTemplateService.getHttpHeaders(curl);
        httpHeaders.add("referer", url);
        HttpEntity<Object> entity = new HttpEntity<>(httpHeaders);
        ResponseEntity<String> exchange = RestTemplateService.restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
        return JSON.parseObject(exchange.getBody());
    }


}
